package com.senlingspace.system.domain;

import java.math.BigDecimal;
import java.util.Date;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.senlingspace.common.annotation.Excel;
import com.senlingspace.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;

/**
 * 订单对象 slkj_order
 *
 * @author SenlingSpace
 * @date 2024-07-25
 */
@EqualsAndHashCode(callSuper = true)
@Data
public class SlkjOrder extends BaseEntity {

    private static final long serialVersionUID = 1L;

    /**
     * 主键
     */
    private Long orderId;

    /**
     * 订单编号
     */
    @Excel(name = "订单编号")
    private String orderNumber;

    /**
     * 门店ID
     */
    // @Excel(name = "门店ID")
    private Long shopId;

    /**
     * 门店名称;冗余字段
     */
    @Excel(name = "门店名称")
    private String shopName;

    /**
     * 订单来源（10=门店，20=抖音，30=美团，40=小程序）
     */
    @Excel(name = "订单来源",readConverterExp = "10=门店,20=抖音,30=美团,40=小程序")
    private Integer source;

    /**
     * 订单类型：101=门票、102=商品、103=门票+商品
     */
    @Excel(name = "订单类型",readConverterExp = "101=门票,102=商品,103=混合订单")
    private Integer orderType;

    /**
     * 项目ID
     */
    // @Excel(name = "项目ID")
    private Long projectId;

    /**
     * 项目名称;冗余字段
     */
    @Excel(name = "项目名称")
    private String projectName;

    /**
     * 核销码
     */
    @Excel(name = "核销码")
    private String verifyCode;

    /**
     * 订单金额，包含优惠+包含税（分）
     */
    @Excel(name = "订单金额")
    private Integer totalAmount;

    /**
     * 优惠金额（分）
     */
    @Excel(name = "优惠金额")
    private Integer discountAmount;

    /**
     * 实际支付金额（分）
     * <p>
     * 如果是拉卡拉支付的话，对应的是拉卡拉的账户端结算金额（acc_settle_amount）
     * 账户端结算金额（acc_settle_amount）=消费者实付金额（payer amount）+账户端优惠金额（acc discount amount）
     */
    @Excel(name = "账户端结算金额")
    private Integer actualAmount;

    /**
     * 税额（分）
     */
    private Integer taxAmount;

    /**
     * 税率
     */
    private BigDecimal taxRate;

    /**
     * 税前金额（分）
     */
    private Integer preTaxAmount;

    /**
     * 税后金额（分）
     */
    private Integer afterTaxAmount;

    /**
     * 总票价（分）
     */
    private Integer ticketTotalAmount;

    /**
     * 服务费 / 10000 = 元
     */
    private Integer feeAmount;

    /**
     * 商户实收金额 / 10000 = 元
     */
    private Integer settleAmount;

    /**
     * 票类订单业务状态：（仅用于orderType=101、103）
     * <p>
     * 待核销（UNREDEEMED）、
     * 已核销（REDEEMED）、
     * 待支付（PENDING_PAYMENT）、
     * 订单取消（ORDER_CANCELLED）、
     * 已退款（REFUNDED）、
     * 已领手环（WRISTBAND_RECEIVED）、
     * 已领设备（DEVICE_RECEIVED）、
     * 已完成（COMPLETED）
     */
    @Excel(name = "订单业务状态",readConverterExp = "UNREDEEMED=待核销,REDEEMED=已核销,PENDING_PAYMENT=待支付,ORDER_CANCELLED=订单取消,REFUNDED=已退款,WRISTBAND_RECEIVED=已领手环,DEVICE_RECEIVED=已领设备,COMPLETED=已完成")
    private String businessStatus;

    /**
     * 商品订单业务状态：（仅用于orderType=102）
     * <p>
     * 待支付（PENDING_PAYMENT）、
     * 已完成（COMPLETED）、
     * 待取货（WAITING_FOR_PICKUP）、
     * 待发货（WAITING_FOR_SHIPPING）、
     * 已发货（SHIPPED）、
     * 订单取消（ORDER_CANCELLED）
     *
     * @version 微信小程序1.0.0
     */
    @Excel(name = "商品业务状态",readConverterExp = "PENDING_PAYMENT=待支付,COMPLETED=已完成,WAITING_FOR_PICKUP=待取货,WAITING_FOR_SHIPPING=待发货,SHIPPED=已发货,ORDER_CANCELLED=订单取消")
    private String goodsStatus;

    /**
     * 支付状态：INIT-初始化 CREATE-下单成功 SUCCESS-交易成功 FAIL-交易失败 DEAL-交易处理中 UNKNOWN-未知状态 CLOSE-订单关闭 PART_REFUND-部分退款 REFUND-全部退款(或订单被撤销）
     */
    @Excel(name = "支付状态",readConverterExp = "INIT=初始化,CREATE=下单成功,SUCCESS=交易成功,FAIL=交易失败,DEAL=交易处理中,UNKNOWN=未知状态,CLOSE=订单关闭,PART_REFUND=部分退款,REFUND=全部退款")
    private String paymentStatus;

    /**
     * 支付方式；WECHAT（微信），ALIPAY（支付宝），UQRCODEPAY（银联支付），BESTPAY（翼支付），DCPAY（数字货币支付），INCASH（现金支付）,SUNING(苏宁易付宝)
     */
    @Excel(name = "支付方式",readConverterExp = "WECHAT=微信,ALIPAY=支付宝,UQRCODEPAY=银联支付,BESTPAY=翼支付,DCPAY=数字货币支付,INCASH=现金支付,SUNING=苏宁易付宝")
    private String paymentType;

    /**
     * 第三方单号;比如：美团、抖音
     */
    @Excel(name = "第三方单号")
    private String thirdOrderNumber;

    /**
     * 支付时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @Excel(name = "支付时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
    private Date paymentTime;

    /**
     * 拉卡拉支付请求ID
     */
    private String paymentRequestId;

    /**
     * 用户ID
     *
     * @version 微信小程序1.0.0
     */
    private Long customerId;

    /**
     * 物流单号
     *
     * @version 微信小程序1.0.0
     */
    private String expressNumber;

    /**
     * 用户选择的收货地址快照 json
     *
     * @version 微信小程序1.0.0
     */
    private String addressSnapshot;

    /**
     * 微信/支付宝，交易单号
     */
    private String accTradeNo;

}
